2013-10-17 29 views
2

我們正在研究Windows 8 JavaScript應用程序並創建了執行所需操作的所有必要框架。該框架無處不在使用jQuery代碼。使用winjs.promise實現.done()。fail()方法

現在,我們必須在後臺任務中使用相同的框架,但事實證明後臺任務不支持jquery,因爲它沒有有效的窗口對象。

因爲我們只使用jQuery的幾個方法,所以我們決定封裝一個封裝類,它將在後臺任務中用作jQuery。

我們被困在使用winJs.promise實現jQuery的延期功能。問題是,在jQuery中,我們使用.done()。fail()來處理解析和拒絕,而在winjs.promise中,.done()最後在方法隊列中實現,並且沒有失敗方法。

我們嘗試實現失敗方法,但無法實現.done()。fail()。

任何人都可以提供任何建議我們如何在包裝類中使用winjs.promise來實現它?

var $ = (function() { 
    function $() { 
    } 


    $.deferred = function() { 
// implement deferred using WinJs.Promise 
    } 

然後,在框架使用此這樣的:

function divide(num1, num2) { 
    var deferred = $.deferred(); 

    if (num2 > 0) { 
     return deferred.resolve(num1/num2); 
    } 
    else { 
     return deferred.reject("num2 can't be zero"); 
    } 
} 

divide(1, 2).done(function (value) { 
    console.log('Anser is:' + value); 
}).fail(function (value) { 
    console.log('Error: ' + value); 
}); 

回答

1

的WinJS promise.done方法具有是誤差函數的第二參數。

promise.done(onComplete, onError, onProgress); 

而你的情況是這樣的:

divide(1, 2).done(function (value){ 
    console.log('Answer is:' + value); 
}, 
function (error) { 
    console.log('Error: ' + error); 
}); 

在自己的函數來做到這一點,你可以從你的包裝返回一個承諾是這樣的:

function divide(num1, num2) { 
    return new WinJS.Promise(function (c, e, p) { 

     if (num2 > 0) { 
      c(num1/num2); 
     } 
     else { 
      e("num2 can't be zero"); 
     } 
    }); 
}