我们为什么要返回deferred.promise()

时间:2016-01-11 08:07:53

标签: jquery

function sync(){
    var timer;
    $('#result').html('waiting…');
    var promise = process();
    promise.done(function(a) {
        $('#result').html('done.'+a);
    });
    promise.fail(function(e) {
        $('#result').html('fail.'+e);
    });
}

function process() {
    var deferred = $.Deferred();
    var url = "https://maps.googleapis.com/maps/api/geocode/json";
    $.ajax({ 
        url: url,
        data: {},
        success: function(data){
            return deferred.resolve(5); // line:1
        },
        error: function(data){
            return deferred.reject(0); // line:2
        }
    });
    return  deferred.promise(); // line:3
}

为什么我们应该在上面的代码中返回deferred.promise()?假设如果我删除第3行,那么我会收到如下错误:

  

TypeError:promise未定义

应该在line#1line#2返回。为什么我们需要line#3以及第3行的用途是什么?

  

如果它在第1行或第2行正确返回那么第3行的用途是什么   see the code here

1 个答案:

答案 0 :(得分:0)

function process() {
    var deferred = $.Deferred();
    var url = "https://maps.googleapis.com/maps/api/geocode/json";
    $.ajax({ 
        url: url,
        data: {},
        success: function(data){
            deferred.resolve(); // line:1
        },
        error: function(data){
            deferred.reject(); // line:2
         }
    });
    return  deferred; // line:3
}

在$ .ajax的回调中不返回任何内容,因为上下文是" window"在ajax request.you可以尝试这个:

function sync(){
     var promise = process();
     promise.done(function() {
         alert('done.');
     });
     promise.fail(function() {
        alert('fail.');
     });
}
function process() {
     var deferred = $.Deferred();
     var url = "https://maps.googleapis.com/maps/api/geocode/json";
     setTimeout(function(){
        if(true){
            deferred.resolve();  
        }
     },3000);
     return  deferred; // line:3
}

这是对你的例子的模拟。