2015-11-13 76 views
0

我正在使用供應商API訪問其服務。該服務作爲jQuery延期對象公開。對於一個完整的商業任務,我在僞代碼中做這樣的事情。如何使用jQuery推遲承諾按順序執行許多任務?

service.do('reset').then(function (result) { 
    return service.setValue(valObj); 
}).then (function (result) { 
    return service.do('runTask'); 
}).then (function (result) { 
    return service.getResult(query); 
}).then (function (result){ 
    console.log('finally done with One task'); 
}); 

每個service.XXX都是一個REST API調用,回調函數將帶回REST響應。我忽略了每個結果如何被簡單使用。

現在我需要在單個業務任務中以嚴格的從頭到尾的順序執行此服務100次。上面的代碼需要執行100次:前一個完成,然後開始下一個。

什麼是在JavaScript中構造這樣的需求的好方法?我正在使用ReactJS和jQuery。

+1

這些結果真的被使用嗎? – fuyushimoya

+1

你有沒有考慮一些JavaScript承諾的基礎庫如https://github.com/kriskowal/q或https://github.com/petkaantonov/bluebird –

+1

我建議閱讀關於承諾的這篇文章。 http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html。這太神奇了...... – IonicBurger

回答

1

如果你真的只是想一遍又一遍地執行同樣的事情,你可以將其放入一個函數中,並在鏈中最後一步完成時調用該函數:

var cntr = 0; 
function run() { 
    if (cntr++ > 1000) return; 
    service.do('reset').then(function (result) { 
     service.setValue(valObj).then (function (result) { 
      service.do('runTask').then (function (result) { 
       service.getResult(query).then (function (result){ 
        console.log('finally done with One task'); 
        run(); 
       }); 
      }); 
     }); 
    }); 
} 

run(); 

僅供參考,你不必這麼深窩的事情。你可以像這樣鏈接你的承諾:

var cntr = 0; 
function run() { 
    if (cntr++ > 1000) return; 
    service.do('reset').then(function (result) { 
     return service.setValue(valObj); 
    }).then (function (result) { 
     return service.do('runTask'); 
    }).then (function (result) { 
     return service.getResult(query); 
    }).then (function (result){ 
     console.log('finally done with One task'); 
     run(); 
    }); 
} 

run(); 
+0

謝謝,它應該工作。我更新了代碼以刪除深度。 –

+0

@ jay.m - 僅供參考,在StackOverflow中,您不應該編輯您的問題以合併答案的各個部分。你可以編輯來澄清你的問題,但你的問題應該仍然是你的問題。答案是代碼中的解決方案或改進的地方。我的回答是否提供了您需要的信息? – jfriend00

+0

thx提醒,下次我不會。是的,我投了你的答案。你認爲現在的問題是清楚的嗎?每次輸入和結果都不一樣,我不會做100次相同的事情。 –

-2

嘗試以下操作:

var i = 100; 
window.running = false; 

while (i > 0 && !window.running) { 
    window.running = true; 
    i--; 

    service.do('reset').then(function (result) { 
     service.setValue(valObj).then (function (result) { 
      service.do('runTask').then (function (result) { 
       service.getResult(query).then (function (result){ 
        //... 

        window.running = false; 
       }); 
      }); 
     }); 
    }); 
} 
+0

這沒有任何意義。 – Bergi

+0

windows.running不是信號量,循環會如何睡眠?您的代碼將退出該循環並且該任務僅運行一次。 –

0

嘗試使用相同的遞歸函數

(function tasks(n, complete) { 
 
    return n < complete ? Promise.resolve("a").then(function(result) { 
 
     return Promise.resolve(result + "b").then(function(result) { 
 
      return Promise.resolve(result + "c").then(function(result) { 
 
       return Promise.resolve(result + "d").then(function(result) { 
 
        console.log("finally done with " + n + " task", result + "" + n); 
 
       }).then(tasks.bind(null, n+1, complete)); 
 
      }); 
 
     }); 
 
    }) : console.log("complete", n, complete) 
 
}(0, 100))

+0

爲什麼所有的'Promise.resolve()'語句?似乎並不需要這些。 – jfriend00