如何从“then”链中的最后一个承诺返回函数中的承诺

EJS*_*EJS 0 javascript selenium return promise

我正在使用 Selenium 和 JavaScript 编写测试。我对两者都是新手,对函数式编程和 promise 也是新手。我正在尝试创建一个需要做 3 件事的函数:

  1. 点击一个输入
  2. 清除输入
  3. SendKeys 输入

我当前的功能不起作用:

    var clearAndSendKeys = function(driver, elementIdentifier, sendKeys) {
        var returnValue;
        driver.findElement(elementIdentifier).then(function(inputField){
            inputField.click().then(function() {
                inputField.clear().then(function() {
                    returnValue = inputField.sendKeys(sendKeys);
                });                 
            });                 
        });
        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)

然后将调用该函数,例如:

    clearAndSendKeys(driver, webdriver.By.id('date_field'), '14.09.2015').then(function(){
        //Do stuff
    });
Run Code Online (Sandbox Code Playgroud)

我希望变量returnValue包含来自sendKeys. 但是,该函数clearAndSendKeys在运行 sendKeys 之前返回未定义的变量。我认为这是因为returnValue从未定义为承诺,因此程序不知道它需要等待sendKeys.

我怎样才能让我的函数clearAndSendKeys从 返回承诺sendKeys?我宁愿避免向clearAndSendKeys函数添加回调。

编辑:.then({return data})从代码中删除,因为这是一个错字。

Fel*_*ing 5

您必须从.then回调中返回每个承诺:

var clearAndSendKeys = function(driver, elementIdentifier, sendKeys) {
    return driver.findElement(elementIdentifier).then(function(inputField){
        return inputField.click().then(function() {
            return inputField.clear().then(function() {
                return inputField.sendKeys(sendKeys);
            });                 
        });                 
    });
}
Run Code Online (Sandbox Code Playgroud)

返回的承诺 .then将解析为与回调返回的值相同的值。


请参阅为什么我的变量在函数内部修改后未更改?-关于为什么您当前的代码不起作用的异步代码参考。Promise 是异步的