簡體   English   中英

異步瀑布等同於Q.

[英]Async waterfall equivalent with Q

我有一個頁面,這是一個帳戶設置頁面。 在其中,我允許我的用戶更新他們的頭像(如果他們已附加圖像),更改他們的電子郵件(如果它已從原始更改),並更改他們的名稱和密碼。

現在,我正在使用async的waterfall方法,但我更換了Q的異步,因為我更喜歡語法(和api)。 我想知道這是否是我應該使用Q代替異步瀑布的方式。

我正在做這樣的事情:

exports.settingsAccountPOST = function(req, res) {
  var doesEmailExist = function() {
    var deferred = Q.defer();

    User.findByEmail({
      email: req.body.email
    }, function(err, user) {
      if (err) {
        deferred.reject(err);
      } else {
        deferred.resolve(user);
      }
    });
    return deferred.promise;
  };

  var updateEmail = function(email) {
    var deferred = Q.defer();

    User.updateEmail({
      userId : req.session.user.id,
      email : req.body.email
    }, function(err, updated) {
      if (err) {
        deferred.reject(err);
      } else {
        deferred.resolve(updated);
      }
    });
    return deferred.promise;
  };

  var updateName = function() {
    var deferred = Q.defer();

    if (req.body.name) {
      User.updateName({
        userId: req.session.user.id,
        name: req.body.name
      }, function(err, updated) {
        if (err) {
          deferred.reject(err);
        } else {
          deferred.resolve(updated);
        }
      });
      return deferred.promise;
    }
  };

  doesEmailExist().then(function(email) {
    if (!email) {
      return(updateEmail(email));
    }
  }).then(function() {
    return(updateName())
  }).then(function() {
    res.redirect('/account')
  });
};

假設正在使用的電子郵件地址出錯。 有沒有辦法將它“傳遞”到最后一個電話? 使用案例:正確更新密碼,但電子郵件更新不起作用,因此我想向用戶顯示會話閃存,告訴他們他們正確更新了密碼,但更新電子郵件時出現問題。

我正在查看文檔,似乎我可能需要使用:

.fin(function () {
});

它是否正確? 如果是這樣,我該怎么做呢? 只需將鏈中發生的錯誤推送到對象,然后遍歷所有錯誤並將其顯示給用戶? 或者只是立即返回並顯示錯誤?

如果你正在使用Q.defer你通常會做錯事。

var findByEmail = Q.nbind(User.findByEmail, User);
var updateEmail = Q.nbind(User.updateEmail, User);
var updateName = Q.nbind(User.updateName, User);

//later on...

exports.settingsAccountPOST = function (req, res) {
    findByEmail({
        email: req.body.email
    })
    .then(function (user) {
        if (!user) {
            return updateEmail({
                userId: req.session.user.id,
                email: req.body.email
            });
        }
    })
    .then(function () {
        return updateName({
            userId: req.session.user.id,
            name: req.body.name
        })
    })
    .then(function () {
        res.redirect("/account");
    })
    .catch(function(e){
        //Handle any error
    });
};

暫無
暫無

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

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