RSVP Promises:为什么父 Promise 等待非链式内部 Promise?
RSVP Promises: Why does parent promise wait on non-chained inner promise?
我们在构建的几个应用程序中使用了旧版本的 RSVP.js。
我希望这个 promise 在输出“1”、“2”并在 5 秒后输出“3”时立即解决。我以为内在的承诺会被当作一个价值来对待。
new RSVP.Promise(function (resolve) {
console.log('1');
var p = new RSVP.Promise(function (innerResolve) {
setTimeout(function () {
console.log('3');
innerResolve();
}, 5000);
});
resolve(p);
}).then(function () {
console.log('2');
});
相反,内部承诺似乎被视为链式承诺。
所以上面的实际输出是:“1”,延迟5秒,“3”,“2”。
我从 RSVP 文档 (https://github.com/tildeio/rsvp.js/#chaining) 中了解到,链式承诺必须遵循特定格式。例如,如果我真的想要后一种行为(1、5 秒延迟,3、2),我会这样编写代码:
new RSVP.Promise(function (resolve) {
console.log('1. Simply resolve a value which happens to be a promise');
resolve();
}).then(function () {
var p = new RSVP.Promise(function (innerResolve) {
setTimeout(function () {
console.log('3. This took a long time!');
innerResolve();
}, 5000);
});
// Return a promise in a then() to chain it!
return p;
}).then(function () {
console.log('2. You should see this immediately!');
});
我问的原因是因为父承诺不在我的控制范围内(它是某些内部框架管道代码的一部分)。我的函数刚刚通过父 promise 的 resolve 和 reject 函数。
function myFunction(parentResolve, parentReject) {
// my code here..
parentResolve(new RSVP.Promise(...)); // want to resolve promise as value
}
我的解决方法是将 promise 包装在一个对象中,但这并不理想。
new RSVP.Promise(function (parentResolve) { // no control over this
console.log('1');
// my code here..
var p = new RSVP.Promise(function (innerResolve) {
setTimeout(function () {
console.log('3');
innerResolve();
}, 5000);
});
// Wrap it in an object
parentResolve({result: p});
}).then(function () {
console.log('2');
});
RSVP 的链接行为是否正确?有没有比将我的承诺包装在一个对象中更好的解决方案?我可能会尝试升级到最新版本的RSVP,看看是否只是因为我的版本过时了。
I thought the inner promise would be treated like a value.
不,不幸的是 resolve
从来没有这样做过。它总是 解决 然后启用,。
Is RSVP's chaining behaviour correct?
是的。
Is there a better solution than wrapping my promise in an object?
不是真的。但我不认为这是一种解决方法。在内部承诺解决之前,您想要传输一些应该立即可用的数据 - 那么这些数据应该放在包装器对象上。或者在内部 promise 解决之前你不需要任何东西,无论如何你都想等待它 - 那么用 promise 解决 promise 的默认行为对你来说是正确的。另见 。
我们在构建的几个应用程序中使用了旧版本的 RSVP.js。
我希望这个 promise 在输出“1”、“2”并在 5 秒后输出“3”时立即解决。我以为内在的承诺会被当作一个价值来对待。
new RSVP.Promise(function (resolve) {
console.log('1');
var p = new RSVP.Promise(function (innerResolve) {
setTimeout(function () {
console.log('3');
innerResolve();
}, 5000);
});
resolve(p);
}).then(function () {
console.log('2');
});
相反,内部承诺似乎被视为链式承诺。
所以上面的实际输出是:“1”,延迟5秒,“3”,“2”。
我从 RSVP 文档 (https://github.com/tildeio/rsvp.js/#chaining) 中了解到,链式承诺必须遵循特定格式。例如,如果我真的想要后一种行为(1、5 秒延迟,3、2),我会这样编写代码:
new RSVP.Promise(function (resolve) {
console.log('1. Simply resolve a value which happens to be a promise');
resolve();
}).then(function () {
var p = new RSVP.Promise(function (innerResolve) {
setTimeout(function () {
console.log('3. This took a long time!');
innerResolve();
}, 5000);
});
// Return a promise in a then() to chain it!
return p;
}).then(function () {
console.log('2. You should see this immediately!');
});
我问的原因是因为父承诺不在我的控制范围内(它是某些内部框架管道代码的一部分)。我的函数刚刚通过父 promise 的 resolve 和 reject 函数。
function myFunction(parentResolve, parentReject) {
// my code here..
parentResolve(new RSVP.Promise(...)); // want to resolve promise as value
}
我的解决方法是将 promise 包装在一个对象中,但这并不理想。
new RSVP.Promise(function (parentResolve) { // no control over this
console.log('1');
// my code here..
var p = new RSVP.Promise(function (innerResolve) {
setTimeout(function () {
console.log('3');
innerResolve();
}, 5000);
});
// Wrap it in an object
parentResolve({result: p});
}).then(function () {
console.log('2');
});
RSVP 的链接行为是否正确?有没有比将我的承诺包装在一个对象中更好的解决方案?我可能会尝试升级到最新版本的RSVP,看看是否只是因为我的版本过时了。
I thought the inner promise would be treated like a value.
不,不幸的是 resolve
从来没有这样做过。它总是 解决 然后启用,
Is RSVP's chaining behaviour correct?
是的。
Is there a better solution than wrapping my promise in an object?
不是真的。但我不认为这是一种解决方法。在内部承诺解决之前,您想要传输一些应该立即可用的数据 - 那么这些数据应该放在包装器对象上。或者在内部 promise 解决之前你不需要任何东西,无论如何你都想等待它 - 那么用 promise 解决 promise 的默认行为对你来说是正确的。另见