Javascript 在执行回调之前我不知道如何返回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

我在主干模型的函数中有一个ajax函数。我希望函数fetchByFBID根据返回的数据的组成返回true或false。但是由于在执行回调之前我不知道数据是什么,所以我不知道如何在该函数中返回true或false。有什么建议吗

  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
       }
    });
    


不行,它是异步的。JavaScript不等待你怎么称呼它?你需要重构它。检查编辑,添加更多信息。如果有一种完全不同的方式,我可以改变它。对我来说很陌生MVC@muistooshort或者,返回一个
承诺
。不管怎么说,这似乎越来越流行了。@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成功回调调用它。从未创建过我自己的回调,但应该不会太难