2016-07-19 3 views
2

Ich bin neu in Javascript und JQuery aufgerufen. Nach meinem Verständnis werden .then() und .done() als Ergebnis von resolve() für das zurückgestellte Objekt ausgelöst. Aber in meinem Code, obwohl resolve() wird nicht aufgerufen, .then() und .done() gefeuertPromises und Deferred: .done() und .then() genannt, obwohl .resolve() für das verzögerte Objekt

<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Testing Promises</title> 
 
</head> 
 

 
<body> 
 

 
<button type="button" onclick="test()"> Click Me</button> 
 

 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 
<script> 
 

 
    function test() { 
 
     var promise = $.when(another); 
 
     promise.done(function() { 
 
      console.log("another() done"); 
 
     }); 
 

 
     promise.done(function() { 
 
      console.log("another() done 2"); 
 
     }); 
 

 
     promise.done(function() { 
 
      console.log("another() done 3"); 
 
     }); 
 

 
     promise.fail(function (error) { 
 
      console.log("Failed with error = ", error); 
 
     }); 
 

 
     promise.then(function() { 
 
      console.log("In then():"); 
 
     }); 
 

 
     console.log("test() done"); 
 
    } 
 

 

 
    function another() { 
 
     var def = $.Deferred(); 
 

 
     console.log("In another()"); 
 
     return def.promise(); 
 
    } 
 
</script> 
 

 
</body> 
 

 
</html>

Antwort

1

$.when(another) ist ein (sofort erfüllt) Versprechen für die another Funktion. Sie werden verwenden möchten

var promise = $.when(another()); 

oder nur

var promise = another(); 

, um tatsächlich die Funktion aufrufen und erstellen Sie die def, die nie behoben ist.

1

Sie vorbei $.when eine Funktion, kein Versprechen . Es erwartet Versprechen. Wenn Sie es ein Versprechen geben (von another tatsächlich telefonieren), erhalten Sie das Verhalten, das Sie erwarten:

function test() { 
 
    var promise = $.when(another()); 
 
    //       ^^-------------- change is here 
 
    promise.done(function() { 
 
    console.log("another() done"); 
 
    }); 
 

 
    promise.done(function() { 
 
    console.log("another() done 2"); 
 
    }); 
 

 
    promise.done(function() { 
 
    console.log("another() done 3"); 
 
    }); 
 

 
    promise.fail(function(error) { 
 
    console.log("Failed with error = ", error); 
 
    }); 
 

 
    promise.then(function() { 
 
    console.log("In then():"); 
 
    }); 
 

 
    console.log("test() done"); 
 
} 
 

 

 
function another() { 
 
    var def = $.Deferred(); 
 
    // Added for testing - start 
 
    setTimeout(function() { 
 
    console.log("waiting..."); 
 
    }, 400); 
 
    setTimeout(function() { 
 
    console.log("waiting..."); 
 
    }, 800); 
 
    setTimeout(function() { 
 
    console.log("resolving..."); 
 
    def.resolve(); 
 
    }, 1200); 
 
    // Added for testing - end 
 

 
    console.log("In another()"); 
 
    return def.promise(); 
 
}
<button type="button" onclick="test()">Click Me</button> 
 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

Verwandte Themen