相关疑难解决方法(0)

链式承诺不会传递拒绝

我有一个问题,理解为什么拒绝不通过承诺链传递,我希望有人能够帮助我理解为什么.对我而言,将功能附加到承诺链意味着我依赖于原始承诺的意图.这很难解释,所以让我先展示一下我的问题的代码示例.(注意:此示例使用Node和延迟节点模块.我使用Dojo 1.8.3进行了测试并得到了相同的结果)

var d = require("deferred");

var d1 = d();

var promise1 = d1.promise.then(
    function(wins) { console.log('promise1 resolved'); return wins;},
    function(err) { console.log('promise1 rejected'); return err;});
var promise2 = promise1.then(
    function(wins) { console.log('promise2 resolved'); return wins;},
    function(err) { console.log('promise2 rejected'); return err;});
var promise3 = promise2.then(
    function(wins) { console.log('promise3 resolved'); return wins;},
    function(err) { console.log('promise3 rejected'); return err;});
d1.reject(new Error());
Run Code Online (Sandbox Code Playgroud)

运行此操作的结果是此输出:

promise1 rejected
promise2 resolved
promise3 resolved
Run Code Online (Sandbox Code Playgroud)

好的,对我来说,这个结果没有意义.通过附加到这个承诺链,每个意味着它意味着它将取决于d1的成功解决和结果传递到链.如果promise1中的promise没有收到wins值,而是在其错误处理程序中得到一个错误的值,那么链中的下一个promise怎么可能调用其成功函数?它无法将有意义的值传递给下一个promise,因为它本身并没有获得值.

我可以用不同的方式描述我在想的是:有三个人,John,Ginger和Bob.约翰拥有一个小部件商店.姜进入他的商店,要求一袋各种颜色的小部件.他没有库存,所以他向他的经销商发送请求将他们运到他手中.与此同时,他给了Ginger一张雨检查,说他欠了她一袋小工具.Bob发现Ginger正在获取小部件并要求他在完成这些小部件后获得蓝色小部件.她同意并给了他一张纸条,说明她会.现在,约翰的经销商找不到他们的供应中的任何小部件,制造商也不再制作它们,所以他们告诉约翰,然后通知姜,她无法获得小部件.Bob怎么能在没有得到任何东西的情况下从Ginger获得蓝色小部件?

我在这个问题上的第三个更现实的观点是这个.假设我有两个我想要更新到数据库的值.一个是依赖于另一个的id,但是在我已经将它插入数据库并获得结果之前我无法获得id.最重要的是,第一个插入依赖于来自数据库的查询.数据库调用返回promises,我用它将两个调用链接成一个序列.

var promise = db.query({parent_id: value});
promise.then(function(query_result) {
    var first_value = …
Run Code Online (Sandbox Code Playgroud)

javascript dojo node.js promise deferred

32
推荐指数
1
解决办法
2万
查看次数

$ q.defer()然后是当时的

我不明白返回值的行为then,

这是它的文档 -

然后(successCallback,errorCallback,notifyCallback) - 无论何时或将要解决或拒绝承诺,只要结果可用,就会异步调用其中一个成功或错误回调.使用单个参数调用回调:结果或拒绝原因.

所以让我们尝试一下,根据以下小代码部分 -

var deferred = $q.defer();
deferred.reject();
deferred.promise.then(function () {
        console.log("1st resolove");
    },
    function () {
        console.log("1st reject");
    }
).then(function () {
    console.log("2nd resolve");
    },
    function () {
        console.log("2nd reject");
    }
);
Run Code Online (Sandbox Code Playgroud)

1)为什么记录 -

1st reject
2nd resolve
Run Code Online (Sandbox Code Playgroud)

代替 -

1st reject
2nd reject
Run Code Online (Sandbox Code Playgroud)

2)我必须更改以使其成为日志 -

1st reject
2nd reject
Run Code Online (Sandbox Code Playgroud)

var myAppModule = angular.module('myApp', []).
		controller('myCtrl',function($scope,$q){
			var deferred = $q.defer();
			//deferred.resolve();
			deferred.reject();
			deferred.promise.then(function () {
					console.log("1st resolove");
				},
				function …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angular-promise

2
推荐指数
1
解决办法
2982
查看次数