2016-03-12 21 views
0
function prepareParams(user) { 
    var deferred = Q.defer(); 

    var params = _.pick(user, 'email', 'password'); 
    _.extend(params, { 
     grant_type : 'password', 
     client_id  : 'client_id', 
     client_secret : 'client_secret' 
    }); 

    return deferred.promise; 
    deferred.resolve(params); 
} 

我想在承諾鏈中使用此函數,但它不返回值。如何編寫返回Q庫承諾的JS函數具有正確的值?

prepareParams(userParams)) 
.then(function(params) { 
    // ERROR!!! params == undefined 
} 
+0

使用promise,no編寫同步代碼是不可能的。但是你顯示的代碼應該基本上工作,如果遇到回調,它將被調用一個不是'undefined'的對象。 – Bergi

+0

你的'then'調用中有一些語法錯誤,大部分你的問題似乎是你試圖在'return'之後'解析'延遲 - 所以它從未被執行。 – Bergi

回答

1

可以編寫同步Promise,但您必須確保先撥打deferred.resolve(params)。一旦你從函數return中,函數中的其他代碼將不會運行。

function prepareParams(user) { 
    var deferred = Q.defer(); 

    var params = _.pick(user, 'email', 'password'); 
    _.extend(params, { 
    grant_type : 'password', 
    client_id  : 'client_id', 
    client_secret : 'client_secret' 
    }); 

    deferred.resolve(params); 
    return deferred.promise; 
} 

請注意,唯一的變化是切換這兩條線。

您的回調中還有一個語法錯誤,關閉夥伴)應該在整個事情的結尾,而不是prepareParams呼叫。這是因爲您打算對prepareParams的結果致電.then。下面是它的樣子:

prepareParams(userParams) 
    .then(function(params) { 
    // should work now :) 
    });