无法从异步方法返回值

时间:2019-02-14 09:47:37

标签: javascript

我需要从一些异步javascript方法中获取一些网络日志, 因此我写了下面的脚本,并在浏览器控制台上执行时返回了期望的值。

let watchDOM = (function(){
  let mo = window.MutationObserver;

  return function(obj, callback){
    if (!obj || !obj.nodeType === 1) {
		return;
	}		

    if (mo) {
      let obs = new mo(function(mutations, observer) {
          callback(mutations);
      });
      obs.observe(obj, { childList:true, subtree:true });
    }
    
    else if (window.addEventListener){
      obj.addEventListener('DOMNodeInserted', callback, false);
      obj.addEventListener('DOMNodeRemoved', callback, false);
    }
  }
})();

watchDOM(document.body, function(e) {
	// This will notify you if a new DIV is added.
	if (e[0].addedNodes[0].tagName === "DIV") {
  	// If the DIV is added, you can then take some action here.
    // For example, you could append your button here.
  	console.log("div added");
    }
});

// This adds a new DIV after 3 seconds of running the script
setTimeout(function() {
	let newDiv = document.createElement("div");
  document.body.appendChild(newDiv);
}, 3000);

现在,我必须在我的Java程序中获取str变量返回的值,为此我必须使用JavaScriptExecutor运行上述脚本,要让str在javaScriptExecutor中返回值,我必须将最后一行代码更改为{{ 1}}

现在我遇到错误“未捕获的SyntaxError:等待仅在异步函数中有效”

1 个答案:

答案 0 :(得分:1)

Chrome控制台支持关键字await而不将其包装在异步函数中,这说明了为什么代码在控制台中起作用。

但是,在控制台之外,必须始终在标记为await的功能内使用键盘操作async

在程序顶部时,必须使用then而不是await,或将所有内容包装到async函数中并调用它(IIFE模式-立即调用的函数表达式):

(aysnc function() {
    // do work
    const val = await something();
    // do something with val
})();

// OR

something().then(val => { // do something with val });

但是,请勿混合使用awaitthen,因为这是多余的。只需将等待的函数返回的值分配给变量:

const val = await something();

或使用then进行访问:

something().then(val => { // do something });