Javascript 在执行回调之前我不知道如何返回true或false
我在主干模型的函数中有一个ajax函数。我希望函数fetchByFBID根据返回的数据的组成返回true或false。但是由于在执行回调之前我不知道数据是什么,所以我不知道如何在该函数中返回true或false。有什么建议吗Javascript 在执行回调之前我不知道如何返回true或false,javascript,ajax,backbone.js,Javascript,Ajax,Backbone.js,我在主干模型的函数中有一个ajax函数。我希望函数fetchByFBID根据返回的数据的组成返回true或false。但是由于在执行回调之前我不知道数据是什么,所以我不知道如何在该函数中返回true或false。有什么建议吗 var UserModel = Backbone.Model.extend({ urlRoot: '/API/users', defaults: { "fbID": "", "firstName": "", "l
var UserModel = Backbone.Model.extend({
urlRoot: '/API/users',
defaults: {
"fbID": "",
"firstName": "",
"lastName": "",
"gender": "",
"email": "",
"site": ""
},
fetchByFBID: function(fbID) {
var that = this;
console.log(this);
$.ajax({url: "/API/users/fbID/"+fbID, type: 'GET', success: function(data) {
if(data === "false") {
return false;
} else {
that.set(JSON.parse(data));
return true;
}
}});
}
});
要调用函数,我只需执行以下操作:
var fbUser = new UserModel();
fbUser.fetchByFBID(response.id);
我的目标是能够做到以下几点:
var fbUser = new UserModel();
if(fbUser.fetchByFBID(response.id))
//do something
else
//do something else
我会在回调函数中添加额外的hidden或any div。将其内容设置为“true”或“false”或任何其他您喜欢的值,并使用事件通知操作您已经得到ajax答案。
这个解决方案使用一种观察者模式。我会添加额外的隐藏或任何div。在回调函数中,将其内容设置为“true”或“false”或任何其他您喜欢的值,并使用事件通知操作您已经得到ajax答案。 此解决方案使用一种观察者模式。您可以:
- 将回调作为参数添加到函数中,并使用true或false异步调用它
var fbUser = new UserModel(); fbUser.fetchByFBID(response.id, function (result) { if (result) { // do something } else { // do something else } );
fetchByFBID: function(fbID, callback) {
.... do your work ....
if(data === "false") {
callback.call(null,true); // or callback(true), callback.call(whatever, true), etc...
} else {
that.set(JSON.parse(data));
callback.call(null,false);
}
- 让函数返回一个“承诺”,而不是真或假,这样您就可以按照
var fbUser = new UserModel(); fbUser.fetchByFBID(response.id).whenDone(function (result) { if (result) { // do something } else { // do something else } });
- 将回调作为参数添加到函数中,并使用true或false异步调用它
var fbUser = new UserModel(); fbUser.fetchByFBID(response.id, function (result) { if (result) { // do something } else { // do something else } );
fetchByFBID: function(fbID, callback) {
.... do your work ....
if(data === "false") {
callback.call(null,true); // or callback(true), callback.call(whatever, true), etc...
} else {
that.set(JSON.parse(data));
callback.call(null,false);
}
- 让函数返回一个“承诺”,而不是真或假,这样您就可以按照
var fbUser = new UserModel(); fbUser.fetchByFBID(response.id).whenDone(function (result) { if (result) { // do something } else { // do something else } });
承诺
。不管怎么说,这似乎越来越流行了。@Jan:单回调方法似乎在node.js的人中很流行,而多回调方法更像jQuery。我认为这是一个品味、地方惯例以及(像往常一样)在特定情况下最有意义的事情。你不能,这是异步的。JavaScript不等待你怎么称呼它?你需要重构它。检查编辑,添加更多信息。如果有一种完全不同的方式,我可以改变它。对我来说很陌生MVC@muistooshort或者,返回一个承诺
。不管怎么说,这似乎越来越流行了。@Jan:单回调方法似乎在node.js的人中很流行,而多回调方法更像jQuery。我认为这是一个品味、本地约定以及(通常)在特定情况下什么最有意义的问题。但是,这是可行的。你也可以使用一些可重复的js函数,每隔一两秒钟检查一次字段内容……不知道为什么处理程序应该挂在dom节点上。但是,这是可行的。您也可以使用一些可重复的js函数,每隔一两秒钟检查字段内容……选项4返回真正的jQuery承诺(具有success/error/always功能的承诺),而不是您自己的承诺。我投这个票。@JanDvorak是真的,尽管我倾向于只对“正常”操作过程使用一次回调,而只对错误/异常情况使用额外回调。(当然,如果在这种情况下,返回false意味着发生了错误,那么两次回调就可以了。)@Jan:但是你又回到了一次回调,因为调用的成功或失败嵌入在返回的数据中,而不是HTTP状态码中。但是,当然,这取决于在特定情况下有什么意义:)@JanDvorak当然支持jquery承诺,但我自己也不知道语法,我想强调重构调用方代码的必要性;)!太棒了,我将考虑添加一个回调作为参数,并从ajax成功回调调用它。从未创建过我自己的回调,但也不应该太硬。选项4返回真正的jQuery承诺(具有success/error/always功能的承诺),而不是您自己的。我投这个票。@JanDvorak是真的,尽管我倾向于只对“正常”操作过程使用一次回调,而只对错误/异常情况使用额外回调。(当然,如果在这种情况下,返回false意味着发生了错误,那么两次回调就可以了。)@Jan:但是你又回到了一次回调,因为调用的成功或失败嵌入在返回的数据中,而不是HTTP状态码中。但是,当然,这取决于在特定情况下有什么意义:)@JanDvorak当然支持jquery承诺,但我自己也不知道语法,我想强调重构调用方代码的必要性;)!太棒了,我将考虑添加一个回调作为参数,并从ajax成功回调调用它。从未创建过我自己的回调,但应该不会太难