加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 使用带有“then”函数的对象解析promise

发布时间:2020-12-17 07:07:40 所属栏目:安全 来源:网络整理
导读:这是一个抽象的问题,因为我现在没有特定的用例.我注意到如果你以承诺解决了承诺 var deferredA = $q.defer();var deferredB = $q.defer();deferredA.promise.then(function(result) { // Will get here once promiseB has been resolved.});deferredA.resolv
这是一个抽象的问题,因为我现在没有特定的用例.我注意到如果你以承诺解决了承诺

var deferredA = $q.defer();
var deferredB = $q.defer();
deferredA.promise.then(function(result) {
  // Will get here once promiseB has been resolved.
});
deferredA.resolve(deferredB.promise);

在promiseB已经解决之前,promiseA实际上并未解决(然后使用promiseB的解析值解析promiseA).但是,如果我想使用“then”函数解析对象的值,如下所示:

var deferred = $q.defer();
deferred.promise.then(function(result) {
  // Aim is to get here with result = {then:function(){}},// as though I had resolved a promise with a non-promise value,// but this function is never called
});
deferred.resolve({
  then: function() {
  }
});

然后,promiseA从未实际得到解决,因为它假设值是一个promise,即使在上面的例子中它不是,因为它不是用$q.defer()创建的.有一个例子plunkr在

http://plnkr.co/edit/Z8XUKzxHtGBKBmgPed2q?p=preview

有没有解决的办法?如果是这样,怎么样?

编辑:澄清推迟/承诺&放入示例“then”回调.

解决方法

您传入的then属性将覆盖promise的then属性.你想要从角度承诺的成功回调中返回你的对象然后像这样的函数:

$scope.resolvePromise2 = function() {
    deferred2.resolve({
      then: function(successCB) {
        successCB({myResult1:'result1',myResult2:'result2','then':function() {console.log("got here")}});
      }
    });
  };

现在调用上面的消息,您可以调用属性中的then函数:

promise2.then(function(result) {
   //Now we get here
   $scope.messages2.push('Promise 2 then callback. Result is:' + result);
   result.then();
});

这是您更新的working plunker.

问题/为什么这样工作让我们看看Angular resolve()

resolve: function(val) {
    if (pending) {
      var callbacks = pending;
      pending = undefined;
      value = ref(val);

      if (callbacks.length) {
        nextTick(function() {
          var callback;
          for (var i = 0,ii = callbacks.length; i < ii; i++) {
            callback = callbacks[i];
            value.then(callback[0],callback[1],callback[2]);
          }
        });
      }
    }
  },

看看value = ref(val);接下来是value.then(callback [0],callback [1],callback [2]);我们看到Angular将then函数作为属性附加到promise,并且您传入的对象会覆盖该属性.所以,在你的情况下,调用传入的函数而不是deferred.promise.then(函数(结果)….

但Angular使用三个回调调用你的then函数(success,error,notify):value.then(callback [0],callback [2]);在var callbacks = pending中保存的;

因此,解决方案是在then函数中调用第一个“success”回调函数,并将对象(包括要返回的then属性)传递给它.现在,承诺将被调用并接收您的对象,包括您的then属性

then: function(successCB) {
   successCB({myResult1:'result1','then':function() {console.log("got here")}});
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读