RSVP承诺:为什么父承诺会等待非链式内部承诺?

时间:2018-04-19 20:32:49

标签: promise rsvp.js rsvp-promise

我们在我们构建的几个应用程序中使用旧版本的RSVP.js。

我预计这个承诺会在输出“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!');
    });

我问的原因是因为父承诺超出了我的控制范围(它是一些内部框架管道代码的一部分)。我的函数刚刚传递了父承诺的解析和拒绝函数。

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,看看它是否仅仅是因为我的过时版本。

1 个答案:

答案 0 :(得分:1)

  

我认为内在的承诺将被视为一种价值。

不,不幸的是resolve从未这样做过。它总是解析 thenables,there is no way to fulfill with a promise

  

RSVP的链接行为是否正确?

  

有没有比在对象中包装我的承诺更好的解决方案?

不是真的。但我不会认为这是一种解决方法。您要么在内部promise解析之前传输一些应该立即可用的数据 - 然后该数据应该包含在包装器对象上。或者你在内部承诺解决之前不需要任何东西,而你想要等待它 - 那么解决带有承诺的承诺的默认行为对你来说是正确的。另请参阅this answer