2017-02-20 94 views
0

请看看这个复制问题的小提琴。这个问题在方案3:JS范围Q承诺问题

JS Fiddle

function processMultistagePromiseBad(func1data, func2data) { 
    console.log("func1data:", func1data); 
    console.log("func2data:", func2data); 
    return work1(func1data) 
    .then(work2(func2data)); 
} 

// scenario 3 
processMultistagePromiseBad(data1, data2) 
.then((results) => { 
    console.log(results); 
    return results; 
}) 
.then((results) => scenario3.innerHTML += results + " <br />"); 

对于这两种方案3 & 4,我传递2个数据对象的js函数,即调用一个承诺链WORK1 & WORK2功能。 Work2在两种情况下运行,但情况3不能正确返回....为什么?

情况4,添加函数声明正在按预期工作......?

感谢, 添

回答

1

。那么预计处理函数会返回一个值,帮助解决/异常,将拒绝承诺 - 你是路过这里的。那么一个承诺,它只是被忽略。将结果返回给解决第一个应许

参考 - chaining promises

function processMultistagePromiseBad(func1data, func2data) { 
 
    console.log("func1data:", func1data); 
 
    console.log("func2data:", func2data); 
 
    return work1(func1data) 
 
    .then((result) => { 
 
     return work2(func2data); 
 
    }); 
 
}

编辑:

然后自己返回一个承诺。您的解析/拒绝功能的返回值被传递给新的承诺。接下来在你的链中使用这个值作为输入。在processMultistagePromiseBad中,work1(func1data)返回解析值为“我是数据1”的承诺。那么(work2(func2data))不会返回一个新的承诺,返回值为“我是数据2”,因为它不会重新调整任何东西。因此,processMultistagePromiseBad返回第一个承诺 - “我是数据1”,因为它未被下一次重新分配。而在过程MultistagePromiseGood它得到重新分配。承诺真的很让人困惑,但是当我们想要执行一些异步操作时它会派上用场。希望这有助于 - MSDN documentation on then

+0

嗨Sanjana,感谢您的建议和链接。我也在寻找为什么work2运行的解释,但是它的返回被忽略,而是返回work1。这里的任何想法?对于JS开发者来说,这是一个容易出错的漏洞,我想更多地理解它,这样我就不会犯这个错误。 – TimO

+0

请参阅编辑。我希望这能帮助你。请仔细阅读文档,因为它帮助我理解了很多。 –