如何从承诺

时间:2016-12-08 00:17:20

标签: javascript jquery jquery-deferred

我有一些像这样的功能

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);
});

但是,结果的内容未定义。

我是否错误地使用了延迟逻辑?那么什么是正确的方式呢?

1 个答案:

答案 0 :(得分:-1)

几个“问题”。

  1. 无论选择使用resolveWith,其语法都将数组作为第二个参数,而不是对象。

  2. 似乎尝试获取具有匹配文本的每个选项的索引。

  3. 在下拉列表中显示具有相同文本的选项可能不常见
  4. 以下修改后的代码示例解析了延迟一次,并显示了传递给resolve方法的值数组如何作为单独的参数传递给done回调。

  5.     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>