gpt4 book ai didi

javascript - 多次promise后需要返回结果

转载 作者:行者123 更新时间:2023-12-02 16:46:07 26 4
gpt4 key购买 nike

当我调用这个函数时,它会立即返回结果,而不是延迟到第三个 promise 之后。我能做什么??

getBlogs: function(blogId){
var blogcomments = new Entities.BlogCommentCollection();
var blogs = new Entities.BlogCollection();
var defera = $.Deferred();
var deferb = $.Deferred();
var deferc = $.Deferred();
var model;
//alert(model);

$.get("/lightning/presentation/blogs", function(val){
defera.resolve(val);
});

var promisea = defera.promise();

$.when(promisea).done(function(val){
var models = initializeBlogs(JSON.parse(val));
blogs.reset(models);
model = blogs.at(blogId);
//alert(JSON.stringify(model));
$.get("/lightning/presentation/blogs/?blogId=" + blogId, function(full){
deferb.resolve(full);
});
});

var promiseb = deferb.promise();

$.when(promiseb).done(function(full){
model.set('full', full);
//alert(JSON.stringify(model));
$.get("/lightning/presentation/blogs/?comments=" + blogId, function(res){
deferc.resolve(res);
});
});

var promisec = deferc.promise();

$.when(promisec).done(function(res){
if(res.length === 0){
blogcomments.reset();
}else{
//alert(res)
var models = initializeBlogComments(JSON.parse(res));
blogcomments.reset(models);
model.set('comments', blogcomments)
//return model;
}
currentBlog = model;
alert(JSON.stringify(model));
//return model;
});
//alert(JSON.stringify(model));
return model;
},

最佳答案

Promise 是异步的。它们不会导致当前函数延迟返回(这将是同步)。他们返回了一个将在未来某个时刻解决的 promise 。

因此,修复代码的最基本方法是返回 promise ,而不是模型

getBlogs: function(blogId) {
var deferAll = $.Deferred();

// your last set will then respond to them all
$.when(promisec).done(function(res){
if(res.length === 0){
blogcomments.reset();
}else{
//alert(res)
var models = initializeBlogComments(JSON.parse(res));
blogcomments.reset(models);
model.set('comments', blogcomments)
//return model;
}
currentBlog = model;

// THIS is where it gets resolved
deferAll.resolve(model);
});

// do whatever you need to
return deferAll.promise();
}

然后你调用 getBlogs

getBlogs(25).then(function(model) {
// model is given here
});

但是,有更好的方法可以做到这一点。首先,你可以链式 promise 。

$.get("/lightning/presentation/blogs/?blogId=" + blogId).then(function(full){...}).then().then() // etc

最后,如果你真的要按照这样的顺序做多个异步事情,我可以推荐 caolan 优秀的异步库吗?它使这样的思考变得容易得多。 https://github.com/caolan/async

关于javascript - 多次promise后需要返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27104747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com