1

Я видел много сообщений о переполнении stackoverflow относительно получения возвращаемого значения асинхронного вызова в функции обратного вызова, но я хотел бы знать, могу ли я получить результат, не вдаваясь в обратный вызов.Результат возврата от асинхронной функции обратного вызова

Для Eg: Текущий сценарий:

myFunc(arg1,arg2, mycallback); 
.. 
function mycallback(values) 
{ 
//Process values 
alert(values); 
} 

То, что я хотел бы иметь:

var returnedValues = myFunc(arg1,arg2, function mycallback(values) 
{ 
return values; 
}); 

// Now I would to use the returnedValues here... 

ли выше сценарий можно? Пожалуйста, дайте мне знать.

Cheers.

+1

Вы хотите будущее ... – texasbruce

+0

Все сообщения, которые вы видели, вероятно, дал тот же ответ, что это не может быть сделано. –

ответ

0

Вы не можете делать то, что вы могли бы сделать, это использовать в Promises

Цитата: ... Я мог бы получить результат, не вдаваясь много внутри обратного вызова.

Если вы обеспокоены callback hell, то есть то, что вы можете смягчить с помощью обещаний:

Пример из bluebird library:

Вы должны использовать обещания, чтобы превратить это:

fs.readFile("file.json", function(err, val) { 
    if(err) { 
     console.error("unable to read file"); 
    } 
    else { 
     try { 
      val = JSON.parse(val); 
      console.log(val.success); 
     } 
     catch(e) { 
      console.error("invalid json in file"); 
     } 
    } 
}); 

Into this: 

    fs.readFileAsync("file.json").then(JSON.parse).then(function(val) { 
     console.log(val.success); 
    }) 
    .catch(SyntaxError, function(e) { 
     console.error("invalid json in file"); 
    }) 
    .catch(function(e) { 
     console.error("unable to read file") 
    }); 
0

Вы можете использовать библиотеку обещаний. Вот реализация с помощью JQuery обещание

(function ($) { 
    function myFunc(arg1,arg2){ 
      var defer = $.Deferred(), 
       result=arg1+arg2; 
      defer.resolve(result); 
      return defer.promise(); 
    } 

    myFunc(1,2).then(function(result){ 
     console.log('result is: '+result) 
     //manipulate result as you want 
     result=result+1; 
     showFinalResult(result); 
    }); 
    function showFinalResult(result){ 
     alert(result); 
    } 
})(jQuery); 

http://jsfiddle.net/gfmvgc8p/