簡體   English   中英

為什么這個Promise無法正常運作?

[英]Why is this Promise not working correctly?

我是jQuery Promises的新手,但是我在應用程序的其他部分很好地使用了它們,但是這一功能似乎並未按預期工作。 似乎在執行下一個代碼之前沒有等待返回。

function setActivityOnGrid(){
...snip...
var sameActivityCnt = $(actId).length;
  if(sameActivityCnt){
    sameActivityDialog().then(function(retVal) {
      if(retVal == true){
        activityid += "-"+sameActivityCnt++;
      }
    });
}
//code here is being executed before the dialog is even shown
}

function sameActivityDialog(){
  var deferred = $.Deferred();

  bootbox.confirm("You have already added this activity. Would you like to add it again?", function(result) {
    deferred.resolve(result);
  });
  return deferred.promise();
}

//code here is being executed before the dialog is even shown//code here is being executed before the dialog is even shown移到此處//code here is being executed before the dialog is even shown

var sameActivityCnt = $(actId).length;
if(sameActivityCnt){
  sameActivityDialog().then(function(retVal) {
    if (retVal === true){
      activityid += "-"+sameActivityCnt++;
    }

    // code goes here!!!!

  });
}

在then回調函數內部(或稍后鏈接的then函數)。

備擇方案

var sameActivityCnt = $(actId).length;
sameActivityDialog().then(function(retVal) {
  if(sameActivityCnt && retVal === true){
    activityid += "-"+sameActivityCnt++;
  }

  // code goes here!!!!

});

要么

var promise = sameActivityDialog();
var sameActivityCnt = $(actId).length;

if(sameActivityCnt){
  promise = promise.then(function(retVal) {
    if (retVal === true){
      activityid += "-"+sameActivityCnt++;
    }
    return retVal;
  });
}

promise = promise.then(function(retVal) {
  // code goes here!!!!
  return retVal;
});

而且,如果您將此邏輯拆分為較小的函數,則實際上可以很好地構成:

function doIf(condition, fn) {
  return function(data) {
    if (condition) {
      return fn(data);
    } else {
      return data
    }
  };
}

function appendID(retVal) {
  if (retVal === true){
    activityid += "-"+sameActivityCnt++;
  }
  return retVal;
}

function doMoreStuff(retVal) {
  // code goes here!!!!
  return retVal;
}

var sameActivityCnt = $(actId).length;

sameActivityDialog()
  .then(doIf(sameActivityCnt, appendID))
  .then(doMoreStuff);

承諾工作正常。 一個諾言不會構成一個非阻塞功能塊。

它為您提供了一個對象,您可以重復添加新的回調,在完成非阻塞功能后,該回調將運行到該對象。

暫無
暫無

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

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