2016-03-12 3 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); 
} 

Я хочу использовать эту функцию в цепочке обещаний, но она не возвращает значение.Как написать функцию JS, которая возвращает обещание библиотеки Q с правильным значением?

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

Невозможно написать синхронный код с помощью обещаний, нет. Но код, который вы показали, должен работать в основном, если встречный вызов встречается, он будет вызываться с объектом, который не является '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; 
} 

Обратите внимание, что единственное изменение заключается в переключении этих двух линий вокруг.

У вас также есть синтаксическая ошибка в вашем обратном вызове, закрытие parens ) должно быть в конце всего, а не в вызове prepareParams. Это связано с тем, что вы намереваетесь позвонить .then по результатам prepareParams. Вот как это должно выглядеть:

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