2017-01-23 34 views
0

我試圖用承諾來確保某些功能不火,直到另一個函數返回。我已經看了很多的例子,別人的問題等,而據我可以告訴我的語法是正確的,但我.then(function())將無法​​運行,所以我必須失去了一些東西。jQuery的承諾沒有。於是觸發()或.done()

function previewMaster() { 

var dfd = $.Deferred(); 

    function prevAndTest() { 
    return true; 
    } 

    var doneYet = false; 

    var intvl = setInterval(function() { 
    if (doneYet === false) { 
     doneYet = prevAndTest(); 
     //reassign doneYet until true 
    } else { 
     clearInterval(intvl); 
     dfd.resolve; 
    return dfd.promise(); 
    } 
    }, 1000); 
} 

既不.then()也不.done()在這裏工作:

var promise = previewMaster(); 
    promise.then(function() { 
    alert("finished"); 
    }); 
因爲該方法 previewMaster沒有返回承諾
+2

'dfd.resolve;'是一個函數...用'dfd.resolve( 「值來解決的承諾,因爲這是承諾做」); ' –

+0

也,你在哪裏返回'dfd.promise()'是完全錯誤的 - 你需要從previewMaster函數返回它,而不是回調到setInterval的 –

+0

@JaromandaX是絕對正確的。文檔:https://api.jquery.com/deferred.resolve/ – YellowShark

回答

2

你的解決方案不起作用:

function previewMaster() { 
    ... 
    return dfd.promise(); 
} 

因爲你需要調用

0123:當你要解決的承諾 resolve功能
dfd.resolve(); 

在這裏看到完整的示例:

function previewMaster() { 

    var dfd = $.Deferred(); 

    function prevAndTest() { 
     return true; 
    } 

    var doneYet = false; 

    var intvl = setInterval(function() { 
     if (doneYet === false) { 
     doneYet = prevAndTest(); 
     //reassign doneYet until true 
     } else { 
     clearInterval(intvl); 
     dfd.resolve(); // <- resolve method must be called to resolve the promise. 
     // return dfd.promise(); // <- Do not return the promise here 
     } 
    }, 1000); 
    return dfd.promise(); // <- Return the promise here 
}