如果存储在变量中,则承诺拒绝不会传递给catch

时间:2017-08-29 12:43:56

标签: javascript ecmascript-6 promise es6-promise

我刚刚接受了许诺的好奇心。 如果我直接在链中拒绝,我可以稍后抓住变量。

如果我拒绝变量,我根本无法捕捉到。在这种情况下,承诺始终被认为是解决的:

let proMISS = Promise.resolve();
proMISS.then(() => console.log('THEN 1'))
       .then(() => Promise.reject())
       .then(() => console.log('THEN 2'));

setTimeout(() => {
    proMISS.catch(() => console.log('CATCH'));
}, 1000);

这确实有效:

let PROmiss = Promise.resolve()
                     .then(() => console.log('THEN 1'))
                     .then(() => Promise.reject())
                     .then(() => console.log('THEN 2'));

setTimeout(() => {
    PROmiss.catch(() => console.log('CATCH'));
}, 1000);

这似乎没有确定性

3 个答案:

答案 0 :(得分:1)

我想我找到了答案。

变量中的promise已经解决,但链不是。 因此,如果你抓住变量,就必须解决它。

每次添加成员时,都必须保存链的最后一个成员。

答案 1 :(得分:1)

你基本上在做

let promise1 = Promise.resolve();
let promise2 = promise1.then(() => console.log('THEN 1'))
       .then(() => Promise.reject())
       .then(() => console.log('THEN 2'));
setTimeout(() => {
    promise1.catch(() => console.log('CATCH'));
    promise2.catch(() => console.log('CATCH'));
}, 1000);

是的,promise1promise2不同。第一个用undefined完成,而第二个被拒绝。

答案 2 :(得分:0)

SyncToServer syncToServer=new SyncToServer(null,"url",jsonObject);
    syncToServer.start(new SyncToServer.OnWebServiceListener() {
        @Override
        public void onComplete(String result) {

        }

        @Override
        public void onError() {

        }
    });
您需要在变量中获取第一个promise链的输出,然后才能处理拒绝。我将 useLibrary 'org.apache.http.legacy' 链的输出放在一个新的变量let proMISS = Promise.resolve(); let promissTwo = proMISS.then(() => console.log('THEN 1')) .then(() => Promise.reject()) .then(() => console.log('THEN 2')); setTimeout(() => { promissTwo.catch(() => console.log('CATCH')); }, 1000);中,然后处理它

你的第二个例子基于相同的概念。