簡體   English   中英

我如何理解 Promise 在代碼中的這種自定義使用

[英]How do I understand this custom use of Promise in code

我在我的應用程序中使用了一些 Promise 代碼,如下所示;

import { Promise, resolve, all } from 'rsvp';


someAction: function(secId, fld, callback) {
    var self = this;
    var section = self.findSection(self.get('allSecs'), secId);
    var myPendingPromise = section.myPendingPromise || resolve();
    myPendingPromise = myPendingPromise.then(function(){
        return self.myCustomPromise(secId, fld, callback);
    });
    set(section, 'myPendingPromise', myPendingPromise);
},


myCustomPromise: function(secId, fld, callback){
    var self = this;
    return new Promise(function(resolve, reject){
        var deferred = self.myCustomRule(someFlds); //Makes an API call
        deferred.then(function(response) {
            resolve(response);
        }, function(){
            resolve(true);
        });
    });
},

現在,我有點困惑為什么要特別添加以下幾行;

var myPendingPromise = section.myPendingPromise || resolve();
myPendingPromise = myPendingPromise.then(function(){
    return self.myCustomPromise(secId, fld, callback);
});
set(section, 'myPendingPromise', myPendingPromise); 

此外,我沒有發現除此功能外在其他任何地方使用了“myPendingPromise”。 是否有一些我需要注意的模式才能理解此代碼? 理解上面這 3 行代碼的用法會很棒。

那是什么

看起來像是通過向承諾鏈(隊列)添加所有新承諾來解決並發問題的嘗試。 我根據您的代碼准備了一個簡化的示例來演示它是如何工作的。

每一行到底是做什么的:

//Extract pending promise from section object. If undefined, use resolve() 
//to create and resolve dummy promise:
var myPendingPromise = section.myPendingPromise || resolve();

//Add new promise to chain, so it would start after 
//pending promise is resolved:
myPendingPromise = myPendingPromise.then(function(){
    return self.myCustomPromise(secId, fld, callback);
});

//Save new promise chain into section object:
set(section, 'myPendingPromise', myPendingPromise); 

為什么它是並發問題的糟糕解決方案(我的意見)

  1. 有點難以閱讀和理解
  2. 如果 promise 需要很長時間才能完成並且someAction被多次調用,隊列可能會無法控制地增長
  3. 似乎沒有任何跡象表明用戶正在運行

什么是好的解決方案(再次,我的意見)

  1. 使用像ember-concurrency這樣的庫來管理並發
  2. 避免對並發問題使用隊列策略。 如果需要使用“隊列”策略,請采取措施限制隊列長度
  3. 添加一些指示,以便用戶看到該按鈕起作用並且請求正在發生。 使用 ember-concurrency 很容易做到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM