2016-02-29 38 views
4

我想學習如何使用承諾,但我有麻煩理解的鏈接。我假設用這個代碼,兩個承諾都會運行。然後,當我調用test.then()時,它應該知道測試已解決並將解析數據傳遞給then()。JS ES6無極鏈

一旦函數結束,它進至下一然後(),重複與TEST2承諾相同的處理。

但是,我只能把它打印出來的第一個應許的結果,而不是第二。任何想法在這裏缺少什麼?

var test = new Promise(function(resolve, reject){ 
    resolve('done1'); 
}); 

var test2 = new Promise(function(resolve, reject){ 
    resolve('done2'); 
}); 

test 
.then(function(data) { 
    console.log(data); 
}) 
.then(test2) 
.then(function(data) { 
    console.log(data); 
}); 
+1

您不能將承諾傳遞給'then',而是一個回調函數。 – Bergi

+0

通常,您將創建基於某些特定需求或輸入返回promise的函數,而不僅僅是將「新」Promise分配給變量。這種創建承諾的方式幾乎是不必要的,除非您將某些其他異步功能調整爲承諾。因此,更合理的虛擬案例可能是:var test2 = x => new Promise(function(res,rej){resolve(x);});因爲至少在那裏你正在建模一個可以處理數據的函數。然後像(test2)這樣的東西實際上可以工作/變得有意義。 – Dtipson

回答

9

您的第一個。然後調用返回undefined,而任何後續。然後期待一個返回的承諾。所以,你需要更改您的代碼:

var test = new Promise(function(resolve, reject){ 
    resolve('done1'); 
}); 

var test2 = new Promise(function(resolve, reject){ 
    resolve('done2'); 
}); 

test 
.then(function(data) { 
    console.log(data); 
    return test2; 
}) 

.then(resultOfTest2 => doSomething) 
.then(function(data) { 
console.log(data); 
}); 
+1

非常感謝。我覺得這是一個愚蠢的想法,但希望它可以幫助其他人有同樣的問題。 – Elliot

3

您需要從then回調返回下一個承諾:

test.then(function(data) { 
    console.log(data); 
    return test2; 
}).then(function(data) { 
    console.log(data); 
}); 
2

你需要返回的第一個應許(測試1)其他承諾(測試2),以允許鏈接:

var test = new Promise(function(resolve, reject){ 
    resolve('done1'); 
}); 

var test2 = new Promise(function(resolve, reject){ 
    resolve('done2'); 
}); 

test 
.then(function(data) { 
    console.log(data); 
    return test2; 
}); 
0

您可能還想試試 -

let test = new Promise(function(resolve, reject){ 
     resolve('done1'); 
    }); 

    let test2 = new Promise(function(resolve, reject){ 
     resolve('done2'); 
    }); 

    try { 
     let logOne = test(); 
     let logTwo = test2(); 
     console.log(logOne); 
     console.log(logTwo); 
    } catch(error) { 
     console.error(error); 
    } 

通過這種方式,您還可以正確處理任何承諾依賴關係。例如,如果測試依賴於測試二的數據,您可以 -

try { 
     let logOne = test(); 
     let logTwo = test2(logOne); 
     console.log(logOne); 
     console.log(logTwo); 
    } catch(error) { 
     console.error(error); 
    }