为什么我的Javascript回调没有定义?

在一个HTML文档中,当页面加载时,脚本会被运行,JS定义了一系列链锁在一起的函数,每当前一个函数被调用时,所有函数都会被调用。done. 我对这个例子有很多疑问。

  1. 为什么 f1 未定义?
  2. 我是否应该能够定义函数 f1, …, f4 也在 callbacksInit以免污染全局命名空间?
  3. 我是否应该能够定义函数f1, …, f4 在JS文档中,在 callbacksInit?
var f1 = function() { console.log("Running f1"); }
var f2 = function() { console.log("Running f2"); }
var f3 = function() { console.log("Running f3"); }
var f4 = function() { console.log("Running f4"); }


function callbacksInit() {
    function start() {
        f1()
        .done(f2)
        .done(f3)
        .done(f4);
    }
    start();
}
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="./callbacks.js"></script>
    </head>

    <body onload="callbacksInit()">
        <main>
            <h1>CALLBACKS ASYNC</h1>
        </main> 
    </body> 
</html>

解决方案:

一个函数本身并不返回任何东西,所以才会有一个 “函数”。undefined

const a = () => { 
  console.log("Running f1"); 
}

// returns "undefined"
const b = () => { 
  console.log("Running f1"); 
  return 'b';
}

// returns "b"

另外 根本就没有 done() 除了jQuery的延迟模式但要使用它,你需要使用jQuery,这不是在标签中的

你需要返回一个 Promise 对象

function a() {
  return new Promise( function(resolve, reject) {
    // now you can either:
    // return resolve('data')
    // return reject(new Error('My error message'))
  });
}

通过返回一个承诺,你现在可以使用正常的回调地狱🤦♂️。

function callbacksInit() {
    function start() {
        f1()
        .then(function(data1) { f2() })
        .then(function(data2) { f3() })
        .then(function(data3) { f4() })
        .then(function(data4) { /* done, continue here */ })
        .catch(function(err) {
           console.log(err.message) // the message of the error upon reject()
        });
    }
    start();
}

或使用asyncawait

function callbacksInit() {
    function async start() {
        try { // there's no "catch" in async/await so we wrap all in try/catch
           var data1 = await f1()
           var data2 = await f2()
           var data3 = await f3()
           var data4 = await f4()
       } catch(err) {
           console.log(err.message) // the message of the error upon reject()
       }
    }
    start();
}

重要提示

总是返回一个 Error 拒绝诺言时的对象,会让你今后的事情变得简单很多😁。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

在xcode-select --install后得到 "由于网络问题,无法下载软件 "的提示。

2022-5-11 14:00:12

解决方案

谷歌AppEngine(GAE)上的Django应用中的秘密。

2022-5-11 14:00:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索