可以承诺有多个参数onFulfilled?
我在这里遵循规范,我不确定是否允许onFulfilled被多个参数调用。 例如:
promise = new Promise(function(onFulfilled, onRejected){ onFulfilled('arg1', 'arg2'); })
这样我的代码:
promise.then(function(arg1, arg2){ // .... });
会收到arg1
和arg2
?
我不在乎如何执行任何具体的承诺,我希望严格遵循w3c规范的承诺。
我在这里遵循规范,我不确定是否允许onFulfilled被多个参数调用。
不,只是第一个参数将被视为promise构造函数中的parsing值。 您可以使用像对象或数组一样的复合值来parsing。
我不在乎如何执行任何具体的承诺,我希望严格遵循w3c规范的承诺。
那就是我相信你错了的地方。 该规范被devise为最小的 ,并build立在承诺库之间的互操作。 这个想法是有一个子集,例如DOM未来可以可靠地使用和库消耗。 承诺实现做你现在所要求的.spread
一段时间。 例如:
Promise.try(function(){ return ["Hello","World","!"]; }).spread(function(a,b,c){ console.log(a,b+c); // "Hello World!"; });
与蓝鸟 。 一个解决scheme,如果你想要这个function是polyfill它。
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); });
本土承诺轻松小提琴 。
你可以使用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]) => { // .... });
承诺的实现价值与函数的返回值相平行,承诺的拒绝原因与函数抛出的exception相平行。 函数不能返回多个值,所以承诺不得超过1个履行价值。
据我可以告诉阅读ES6承诺规范和标准承诺规范 theres没有任何条款阻止处理这种情况下的实施 – 但是它没有在下面的库中实现:
- RSVP.promise(#L516-544)
- Q诺(#787)
我假设他们忽略多重argparsing的原因是使更改顺序更简洁(即只能返回一个函数中的值,这样会使控制stream程更不直观)。示例:
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); });
我正在寻找相同的解决scheme,并发现从这个答案非常intersting: 在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
我有同样的问题,我通过在服务上添加一个头来解决这个问题
@Provider public class CORSFilter implements ContainerResponseFilter { @Override public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext cres) throws IOException { cres.getHeaders().add("Access-Control-Allow-Origin", "*"); cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, Authorization, Authentication"); cres.getHeaders().add("Access-Control-Allow-Credentials", "true"); cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); cres.getHeaders().add("Access-Control-Max-Age", "1209600"); //I just add this header cres.getHeaders().add("access-control-expose-headers" , "Authorization"); } }
为了引用下面的文章,“then”有两个参数,一个是成功案例的callback,另一个是失败案例,两者都是可选的,所以只能为成功或失败案例添加一个callback。
我通常看这个页面的任何基本承诺问题,让我知道如果我错了
由于JavaScript中的函数可以用任意数量的参数来调用,除了下面的子句,文档并没有对onFulfilled()方法的参数进行任何限制,我认为你可以将多个parameter passing给onFulfilled()方法因为诺言的价值是第一个论点。
2.2.2.1 it must be called after promise is fulfilled, with promise's value as its first argument.
很好的问题,本杰明,克里斯等人的很好的回答 – 非常感谢!
我在一个项目中使用它,并创build了一个基于Benjamin Gruenwald代码的模块。 它在npmjs上可用:
npm i -S promise-spread
然后在你的代码中,这样做
require('promise-spread');
如果你正在使用诸如any-promise
类的库
var Promise = require('any-promise'); require('promise-spread')(Promise);
也许其他人也觉得这有用!