我可以控制then()方法返回的promise的解析方式

时间:2017-06-21 13:50:50

标签: javascript ecmascript-6 promise

鉴于我创建了myPromise。 它结算时返回另一个promise

let myPromise = new Promise((resolve: Function, reject: Function) => {
    setTimeout(() => {
        resolve('my promise resolved after 2 seconds');
     }, 2000);
})


myPromise.then(value => {
    console.log(value);
}).then((value) => {
    // how can I make the promise returned by myPromise.then() 
    //resolve in a specific way ?
})

如何控制promise退回的myPromise.then()结算方式?

2 个答案:

答案 0 :(得分:0)

如果您不需要执行其他异步操作,只需返回值:

myPromise.then(value => {
    return value;
}).then((value) => {
    // ...
})

但我不确定你为什么这样做,考虑到你可以删除第一个.then并在第二个.then中执行所有操作。

如果您必须执行另一项异步操作,您可以在需要时返回新的承诺并解决:

myPromise.then(value => {
    // Do some other async operation. I am explicitly creating the promise 
    // here inline to be clear. In real code, you'd probably want to wrap this 
    // in another function.
    return new Promise((resolve: Function, reject: Function) => {
        resolve(value);
    });
}).then((value) => {
    // ...
})

答案 1 :(得分:0)

.then()处理程序中,您有三个选项都会影响.then()调用返回的承诺(我将其称为“父”承诺)。

  1. 返回一个值。当您从.then()处理程序返回一个值时,该值将成为.then()时返回的promise的已解析值原来叫做。

  2. 返回一个承诺。当您从.then()处理程序返回一个承诺时,它将被链接到父承诺,而父承诺将“跟随”新承诺(解决/价值,拒绝/理由)。

  3. 抛出异常。这将导致父承诺被拒绝,异常成为拒绝原因。

  4. 如果您从.then()处理程序返回的内容与return undefined相同,那么它只会将已解析的值设置为undefined(与返回undefined的值相同)。

    您显示的结构:

    myPromise.then(value => {
        console.log(value);
    }).then((value) => {
        // how can I make the promise returned by myPromise.then() 
        //resolve in a specific way ?
    });
    

    很麻烦,因为第一个.then()处理程序没有返回任何内容。这与返回undefined相同,因此第二个value始终为undefined,因此无用。如果你有第一个.then()处理程序的实际原因,你可以通过这样返回它来保持所需的值:

    myPromise.then(value => {
        console.log(value);
        return value;
    }).then((value) => {
        // how can I make the promise returned by myPromise.then() 
        //resolve in a specific way ?
    });