2016-12-08 7 views
0

У меня есть некоторые функции, как этотКак вернуть данные из обещание

function getIndex(name) { 
    var deferred = $.Deferred(); 
    var index = 0; 
    $("#dropDown option").each(function() { 
     if ($(this).text() === name) { 
      index = this.index + 1; 
      deferred.resolveWith(this, {result: index }); 
      return deferred.promise(); 
     } 
    }); 

    deferred.resolveWith(this, { result: index }); 
    return deferred.promise(); 
} 

И тогда я звоню функцию:

getIndex("Hello World").done(function(result) { 
alert (result); 
}); 

Однако содержание результата не определено.

Я неправильно использую отложенную логику? Что тогда будет правильным?

+0

пытаются использовать 'deferred.resolve' вместо' resolveWith' –

+2

Почему вы используете обещание? Обещания хороши для асинхронной логики, но в вашем коде нет асинхронного. – abl

+0

@abl Вы имеете в виду, что я могу сделать var index = getIndex («Hellow World»), а затем сделать предупреждение (результат) без проблем? – user3587624

ответ

-1

Несколько «проблем».

  1. Независимо от выбора, чтобы использовать resolveWith, его синтаксис принимает массив в качестве второго аргумента, а не объект.

  2. Похоже, что попытка получить индекс каждой опции, имеющей соответствующий текст. Представляя варианты с тем же текстом в выпадающий может быть необычным

  3. Следующий модифицированный пример кода решает отсроченной один раз, и показывает, как массив значений, передаваемых методу resolve передается в виде отдельных параметров для done обратного вызова.

function getIndex(name) { 
 
     var deferred = $.Deferred(); 
 
     var result = []; 
 
     $("#dropDown option").each(function() { 
 
      if ($(this).text() == name) { 
 
       result.push(this.index + 1); 
 
      } 
 
     }); 
 
     deferred.resolveWith(this, result); 
 
     console.log("result in getIndex: " + result); 
 
     return deferred.promise(); 
 
    } 
 
    
 
    getIndex("hello folks and world").done(function(a, b) { 
 
     console.log("done callback arguments: " + a + ", " + b); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<select id="dropDown"> 
 
    <option>hello folks and others</option> 
 
    <option>hello folks and world</option> 
 
    <option>hello folks and world</option> 
 
</select>

+0

Какой смысл использовать обещание с синхронной работой? Это просто усложняет простой код. 'getIndex()' может также просто возвращать результат напрямую - никаких обещаний не было. – jfriend00

+0

@ jfriend00 Я поставил вопрос о том, как получить отсрочку на работу вообще, используя сфабрикованный пример. «Привет, ребята» в выпадающем списке? – traktor53

 Смежные вопросы

  • Нет связанных вопросов^_^