【问题标题】:return the value from a promise/ajax call with jquery从使用 jquery 的 promise/ajax 调用返回值
【发布时间】:2013-10-04 22:28:37
【问题描述】:

var viewmodel = service.createCustomer(); 是我调用 requirejs 模块的方式。

如何创建一个延迟对象,让我的 createCustomer 返回在服务调用中创建的 CreateCustomerViewModel?

define(['viewmodels/CreateCustomerViewModel'],function (CreateCustomerViewModel) {

    function createCustomer() {
        $.getJSON('Customer/Create')
         .done(function (response) {
             return new CreateCustomerViewModel(response);
         })
         .fail(function (error) {
             alert(error);
         });
    }   

    return {        
        createCustomer: createCustomer        
    };
});

【问题讨论】:

    标签: jquery requirejs promise deferred


    【解决方案1】:
    1. 您必须使用.then() 而不是.done() 来修改有效负载。
    2. 您应该让您的createCustomer 方法返回修改后的有效负载。

    您的模块定义变为:

    function createCustomer() {
        return $.getJSON('Customer/Create')
            .then(function (response) {
                return new CreateCustomerViewModel(response);
            });
    }
    
    return {
        createCustomer: createCustomer
    };
    

    用作:

    customerCreator.createCustomer()
        .done(function (model) {
            // yay! let's use this model
        })
        .fail(function () {
            console.error("Cannot create customer");
        });
    

    您还应该将.fail() 处理移到应用程序中尽可能高的位置,以便错误消息中的措辞可以具有更准确的上下文。

    附:作为一个挑剔的人,您不应该使用 POST 请求而不是 GET 来创建实体吗?

    【讨论】:

    • 两件事:我想通过 var viewmodel = service.createCustomer() 获取返回值,并且 .done .fail 应该在服务中,因为它们可能是服务错误。视图模型不知道这一点。此外,它是一个 GET 请求,因为我不发布数据我检索数据以供公式生成器显示,然后我发布一个帖子;-)
    • 由于$.getJSON 将是异步的,因此您不能执行viewmodel = service.createCustomer()。您必须使用经典回调或 Promise(更好)。
    • 对于那些使用 jQuery pipe 而不是 then。我浪费了几个小时来处理这个问题。
    猜你喜欢
    • 2016-03-11
    • 2011-09-21
    • 2012-06-01
    • 2017-11-04
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多