承诺可以有多个论点来实现吗?

我遵循的是 给你规范,我不确定它是否允许用多个参数调用 onFulfill。例如:

promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})

这样我的代码:

promise.then(function(arg1, arg2){
// ....
});

会同时接收 arg1arg2吗?

我不关心任何具体的承诺实现是如何做到的,我希望严格遵循 w3c 规范。

121158 次浏览

引用下面的文章,“ then”有两个参数,一个是成功案例的回调,另一个是失败案例的回调。两者都是可选的,因此只有在成功或失败的情况下才能添加回调。”

我通常在这一页寻找任何基本的承诺问题,让我知道如果我错了

Http://www.html5rocks.com/en/tutorials/es6/promises/

因为 Javascript 中的函数可以使用任意数量的参数来调用,而且除了下面的子句之外,文档并没有对 onFulfilled()方法的参数设置任何限制,我认为你可以向 onFulfilled()方法传递多个参数,只要承诺的值是第一个参数。

2.2.2.1它必须在承诺实现之后被召唤,承诺的价值作为它的第一个参数。

据我所知,阅读 ES6承诺规范标准承诺规范标准承诺规范并没有阻止实现处理这种情况的条款——然而它并没有在以下库中实现:

我假设他们省略多参数分辨率的原因是为了使更改顺序更简洁(例如,你只能在一个函数中返回一个值,这会使控制流不那么直观)示例:

new Promise(function(resolve, reject) {
return resolve(5, 4);
})
.then(function(x,y) {
console.log(y);
return x; //we can only return 1 value here so the next then will only have 1 argument
})
.then(function(x,y) {
console.log(y);
});

我遵循这里的规范,我不确定它是否允许使用多个参数调用 onFulfill。

没有,只有第一个参数将被视为分辨率值的承诺构造函数。可以使用复合值(如对象或数组)进行解析。

我不关心任何具体的承诺实现是如何做到的,我希望严格遵循 w3c 规范。

这就是我认为你错了的地方。该规范是 被设计成最小的,是为承诺库之间的互操作而构建的。这个想法是有一个子集,例如 DOM 期货可以可靠地使用它,库可以使用它。现在,承诺实现可以对 .spread执行一段时间的任务。例如:

Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});

使用 青鸟。一个解决方案,如果你想要这个功能是多填充它。

if (!Promise.prototype.spread) {
Promise.prototype.spread = function (fn) {
return this.then(function (args) {
return Promise.all(args); // wait for all
}).then(function(args){
//this is always undefined in A+ complaint, but just in case
return fn.apply(this, args);
});
};
}

这可以让你做到:

Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});

与原生承诺放松 小提琴。或使用传播,现在(2018年)在浏览器中很常见:

Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});

或者等待:

let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);

承诺的履行价值与函数的返回值平行,承诺的拒绝原因与抛出的函数异常平行。函数不能返回多个值,因此承诺的实现值不能超过1个。

这里是一个 CoffeeScript 解决方案。

我正在寻找同样的解决方案,并从这个答案中发现了一些非常有趣的东西: 在 AngularJS 中拒绝带有多个参数(如 $http)的承诺

这个人的答案是 弗洛里安

promise = deferred.promise


promise.success = (fn) ->
promise.then (data) ->
fn(data.payload, data.status, {additional: 42})
return promise


promise.error = (fn) ->
promise.then null, (err) ->
fn(err)
return promise


return promise

使用它:

service.get().success (arg1, arg2, arg3) ->
# => arg1 is data.payload, arg2 is data.status, arg3 is the additional object
service.get().error (err) ->
# => err

很好的问题,本杰明,克里斯等人给出了很好的答案——非常感谢!

我在一个项目中使用它,并且创建了一个基于 Benjamin Gruenwald 的密码的模块:

npm i -S promise-spread

然后在你的代码中,做

require('promise-spread');

如果您正在使用诸如 any-promise之类的库

var Promise = require('any-promise');
require('promise-spread')(Promise);

也许其他人也会觉得这很有用!

您可以使用 E6解构:

物体解构:

promise = new Promise(function(onFulfilled, onRejected){
onFulfilled({arg1: value1, arg2: value2});
})


promise.then(({arg1, arg2}) => {
// ....
});

数组解构:

promise = new Promise(function(onFulfilled, onRejected){
onFulfilled([value1, value2]);
})


promise.then(([arg1, arg2]) => {
// ....
});

在 ES6中解构分配会有所帮助。对于 Ex:

let [arg1, arg2] = new Promise((resolve, reject) => {
resolve([argument1, argument2]);
});