Layabox -__awaiter is not defined和TypeScript error: Error TS2468: Cannot find global value 'Promise'

上面对问题做一下总结:在Layabox中出现不能使用Promise的情况,
1、不能使用Promise。
2、在async函数中不能使用await。

一、不能使用Promise,原因是Laya并没有对Promise申明。这个时候我们需要自己申明一个Promise的ts文件就可以了。
在根目录的libs中创建extend.d.ts文件,并将一下代码拷入其中(不用去看这个),你就可以使用Promise了。

interface Promise {
  then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): Promise;
  catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): Promise;
}

interface PromiseConstructor {
  readonly prototype: Promise;
  new (executor: (resolve: (value?: T | PromiseLike) => void, reject: (reason?: any) => void) => void): Promise;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike, T10 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike]): Promise<[T1, T2, T3, T4, T5]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike]): Promise<[T1, T2, T3, T4]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike]): Promise<[T1, T2, T3]>;
  all(values: [T1 | PromiseLike, T2 | PromiseLike]): Promise<[T1, T2]>;
  all(values: (T | PromiseLike)[]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike, T10 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike]): Promise;
  race(values: [T1 | PromiseLike, T2 | PromiseLike]): Promise;
  race(values: (T | PromiseLike)[]): Promise;
  reject(reason: any): Promise;
  reject(reason: any): Promise;
  resolve(value: T | PromiseLike): Promise;
  resolve(): Promise;
}

declare var Promise: PromiseConstructor;

二、__awaiter 没有定义,哈哈,你的代码编译可以通过了,但是不能运行。检查编译后的js代码,发现没有编译__awaiter和__generator两个方法。
a、在bin->libs目录下创建promise.js文件,并将一下代码拷入到promise.js中

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [0, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};

b、在index.js文件中引入promise.js文件即可loadLib("libs/promise.js")

现在你可以顺利的将你的代码在引擎或者在chrome中跑起来了。

三、你高高兴兴的将你的工程打包成微信成功,并在微信开发者工具中运行,结果微信开发者工具中晴天霹雳一般的出现了__awaiter is not defined
Layabox -__awaiter is not defined和TypeScript error: Error TS2468: Cannot find global value 'Promise'_第1张图片
你明明记得自己已经实现了__awaiter和__generator两个方法,为什么这里还找不到呢。
嘿嘿,Laya打包的时候并没有将这个文件的内容拷入到bundle.js中,所以这一步已经很简单了
将之前的promise.js文件的内容拷入到bundle.js文件开头运行,一切完美的跑起来了。

如果你遇到的问题刚好帮你解决了,那么恭喜你,你少了很多时间查找解决方案,这三步我在Laya中都遇到过,而且基本上每一个在论坛中都不好找。
如果你最后在手机上运行起来Promise报错,请看我的另外一篇可能可以帮你解决问题。

你可能感兴趣的:(LayaBox)