2017-06-07 40 views
-2

我正在嘗試運行promise(這會在每個API上調用一些其他API)。根據這兩個承諾的結果,使用第三個函數處理數據。而且,依次運行的功能可能會發生變化。所以我以動態的方式建立了諾言。按順序運行JavaScript承諾。一個接一個地結束

然而,承諾似乎沒有開始前一個結局。這裏是測試相同概念的簡化模型。

var funcs = [ 
 
\t() => { 
 
    console.log('Task 1 Sart =', new Date()); 
 
    \t sleeper(6000, 'Task 1 Resolved'); 
 
    console.log('Task 1 Return'); 
 
    }, 
 
() => { 
 
    console.log('Task 2 Sart=', new Date()); 
 
    \t sleeper(5000, 'Task 2 Resolved'); 
 
    console.log('Task 2 Return'); 
 
    }, 
 
() => { 
 
    console.log('Task 3 Start=', new Date()); 
 
    console.log('Task 2 Return'); 
 
    } 
 
]; 
 

 
function sleeper(m, msg) { 
 
\t return new Promise(function(resolve, reject) { 
 
    \t setTimeout(function() { 
 
    resolve(console.log(msg, new Date())); 
 
    \t }, m); 
 
\t }); 
 
} 
 

 
function runSequence(functionSequence) { 
 
    return functionSequence.reduce((p, func) => { 
 
     return p.then(func); 
 
    }, Promise.resolve()); 
 
} 
 

 
var v = runSequence(funcs);

結果如下所示 VM128:51任務1薩爾特=星期三2017年6月7日13時54分34秒GMT-0700(PDT) VM128:53任務1返回 VM128 :56任務2薩爾特=星期三2017年6月7日13時54分34秒GMT-0700(PDT) VM128:58任務2返回 VM128:61任務3開始=星期三2017年6月7日13時54分34秒GMT-0700(PDT ) VM128:62任務2返回 VM238:69任務2解決星期​​三2017年6月7日13時54分39秒GMT-0700(PDT) VM238:69任務1已解決Wed Jun 07 2017 13:54:40 GMT-0700(PDT)

我假設我沒有看到第二個任務開始,直到第一個任務結束。看起來他們都是按順序開始的。我錯過了什麼,或完全誤解了承諾的工作原理。我想實現是有第一個完成,然後根據意見如下開始

+1

缺失,無'Promise'或其他值是從功能'funs'陣列,IEG,'返回軌枕(6000, '任務1解決' 返回);' – guest271314

+1

好的。我明白你在指出什麼。有了回報,它會按順序執行某些操作 –

+0

_「問題不在於價值返回的位置。」_是的。從函數返回'Promise',否則無法確定任務在執行異步過程的匿名函數調用中完成。儘管'sleeper()'調用你已經返回一個'Promise',但它並不會從匿名函數調用中返回。另見https://stackoverflow.com/questions/44380582/wait-for-node-js-stream-readable-pipe-to-complete? – guest271314

回答

-2

。這是版本的作品。一個簡單的返回從原始代碼

var funcs = [ 
 
\t() => { 
 
    console.log('Task 1 Sart =', new Date()); 
 
    \t return sleeper(7000, 'Task 1 Resolved');  
 
    }, 
 
() => { 
 
    \t console.log('Task 2 Sart=', new Date()); 
 
    \t return sleeper(3000, 'Task 2 Resolved'); 
 
    }, 
 
() => { 
 
    console.log('Task 3 Start=', new Date()); 
 
    console.log('Task 3 Return'); 
 
    } 
 
]; 
 

 
function sleeper(m, msg) { 
 
\t return new Promise(function(resolve, reject) { 
 
    \t setTimeout(function() { 
 
    resolve(console.log(msg, new Date())); 
 
    \t }, m); 
 
\t }); 
 
} 
 

 
function runSequence(functionSequence) { 
 
    return functionSequence.reduce((p, func) => {  
 
    return p.then(func); 
 
    }, Promise.resolve()); 
 
} 
 

 
runSequence(funcs);