Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “为什么?”;拒绝“;在这个代码中不是真的拒绝吗?_Javascript_Typescript_Promise - Fatal编程技术网

Javascript “为什么?”;拒绝“;在这个代码中不是真的拒绝吗?

Javascript “为什么?”;拒绝“;在这个代码中不是真的拒绝吗?,javascript,typescript,promise,Javascript,Typescript,Promise,代码本身运行;是否有一个明显的解决办法,我不知何故错过了 Webstorm中的调试器在调试期间突出显示reject语句,但代码从未实际拒绝;然后,调试器突出显示fulfill语句,并最终返回到then块,但是在下一步中会立即跳过then块,然后运行catch块 我还有另外一个承诺,那就是然后捕获代码,我也会返回。我的计划是捕获helper函数的拒绝,在我的主函数捕获它之后,再次将其作为返回值(promise)拒绝 但是,当调试器在从helper函数返回后突出显示catch语句时,似乎跳过了块中的

代码本身运行;是否有一个明显的解决办法,我不知何故错过了

Webstorm中的调试器在调试期间突出显示
reject
语句,但代码从未实际拒绝;然后,调试器突出显示
fulfill
语句,并最终返回到
then
块,但是在下一步中会立即跳过
then
块,然后运行
catch

我还有另外一个承诺,那就是
然后捕获
代码,我也会返回。我的计划是捕获helper函数的拒绝,在我的主函数捕获它之后,再次将其作为返回值(promise)拒绝
但是,当调试器在从helper函数返回后突出显示
catch
语句时,似乎跳过了块中的所有代码(在我的helper函数全部完成并返回到主函数后)

我的拒绝代码:

public static filter(courses: Course[], filterObj: FILTER, comparison: string) {
        return new Promise(function (fulfill, reject) {
            let filter: any = (<any>filterObj)[comparison]; 

            let names = Object.keys(filter);
            if (names.length !== 1)
            {
                console.log("??");
                reject({"code": 400, "body": {"error": "invalid comparison"}});
            }
            let name = names.toString();

            if (!CHelpers.isDataset(name))
            {
                reject({"code": 400, "body": {"error": "invalid comparison"}});
            }

            let filterValue: number = filter[name];
            if (typeof filterValue !== "number")
            {
                reject({"code": 400, "body": {"error": "invalid comparison"}});
            }

            let key: string = CHelpers.getKey(name);
            console.log("successfully filtered " + comparison);
            fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison));

        })
    }
我的主要功能如下所示:

doThing(input: any): Promise < {} >
    {
        return new Promise(function(fulfill, reject) {
            let courses: Course[];
            let filterObj: FILTER = input.KEY;
            let comparisons: string[] = Object.keys(filterObj);
            let comparison: string = comparisons[0];
            if (comparison === "test") {
                CHelpers.filter(courses, filterObj, comparison)
                    .then(function(filteredCourses: any) {
                        courses = filteredCourses;
                    })
                    .catch(function(err: any) {
                        return reject(err);
                    });
            } else {
                reject({
                    "code": 400,
                    "body": {
                        "error": "invalid body"
                    }
                });
            }

            let responseBody: {} = {
                render: "TABLE",
                result: courses
            };

            fulfill({
                "code": 200,
                "body": responseBody
            });
        });
    }
doThing(输入:any):Promise<{}>
{
返回新承诺(功能(履行、拒绝){
let课程:课程[];
让filterObj:FILTER=input.KEY;
let比较:string[]=Object.keys(filterObj);
let comparison:string=比较[0];
如果(比较=“测试”){
CHelpers.过滤器(课程、过滤器BJ、比较)
.then(函数(filteredCourses:any){
课程=过滤课程;
})
.catch(函数(错误:任意){
退货拒绝(err);
});
}否则{
拒绝({
“代码”:400,
“正文”:{
“错误”:“无效正文”
}
});
}
let responseBody:{}={
渲染:“表”,
结果:课程
};
履行({
“代码”:200,
“body”:responseBody
});
});
}
拒绝()
不会停止该块中代码的执行。这只是一个函数调用,因此在该函数调用之后,
处理程序的其余部分将继续运行。由于承诺是单向状态机,因此在调用
reject()
之后,对
reject()
fulfill()
的后续调用将被忽略,但将执行其他
console.log()
语句

通常,当您返回时,您会立即从函数返回,这样您就不会再执行任何代码

public static filter(courses: Course[], filterObj: FILTER, comparison: string) {
        return new Promise(function (fulfill, reject) {
            let filter: any = (<any>filterObj)[comparison]; 

            let names = Object.keys(filter);
            if (names.length !== 1)
            {
                console.log("??");
                return reject({"code": 400, "body": {"error": "invalid comparison"}});
            }
            let name = names.toString();

            if (!CHelpers.isDataset(name))
            {
                return reject({"code": 400, "body": {"error": "invalid comparison"}});
            }

            let filterValue: number = filter[name];
            if (typeof filterValue !== "number")
            {
                return reject({"code": 400, "body": {"error": "invalid comparison"}});
            }

            let key: string = CHelpers.getKey(name);
            console.log("successfully filtered " + comparison);
            fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison));

        })
    }
或作为:

reject(...);
return;
由于
reject()
没有返回值,因此这两种形式在功能上是等效的。

reject()
不会停止该块中代码的执行。这只是一个函数调用,因此在该函数调用之后,
处理程序的其余部分将继续运行。由于承诺是单向状态机,因此在调用
reject()
之后,对
reject()
fulfill()
的后续调用将被忽略,但将执行其他
console.log()
语句

通常,当您返回时,您会立即从函数返回,这样您就不会再执行任何代码

public static filter(courses: Course[], filterObj: FILTER, comparison: string) {
        return new Promise(function (fulfill, reject) {
            let filter: any = (<any>filterObj)[comparison]; 

            let names = Object.keys(filter);
            if (names.length !== 1)
            {
                console.log("??");
                return reject({"code": 400, "body": {"error": "invalid comparison"}});
            }
            let name = names.toString();

            if (!CHelpers.isDataset(name))
            {
                return reject({"code": 400, "body": {"error": "invalid comparison"}});
            }

            let filterValue: number = filter[name];
            if (typeof filterValue !== "number")
            {
                return reject({"code": 400, "body": {"error": "invalid comparison"}});
            }

            let key: string = CHelpers.getKey(name);
            console.log("successfully filtered " + comparison);
            fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison));

        })
    }
或作为:

reject(...);
return;

由于
reject()
没有返回值,因此这两种形式在功能上是等效的。

您应该尝试为fully和reject函数添加返回语句

public static filter(courses: Course[], filterObj: FILTER, comparison: string) {
    return new Promise(function (fulfill, reject) {
        let filter: any = (<any>filterObj)[comparison]; 

        let names = Object.keys(filter);
        if (names.length !== 1)
        {
            console.log("??");
            return reject({"code": 400, "body": {"error": "invalid comparison"}});
        }
        let name = names.toString();

        if (!CHelpers.isDataset(name))
        {
            return reject({"code": 400, "body": {"error": "invalid comparison"}});
        }

        let filterValue: number = filter[name];
        if (typeof filterValue !== "number")
        {
            return reject({"code": 400, "body": {"error": "invalid comparison"}});
        }

        let key: string = CHelpers.getKey(name);
        console.log("successfully filtered " + comparison);
        return fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison));

    })
}
公共静态筛选器(课程:课程[],筛选器对象:筛选器,比较:字符串){
返回新承诺(功能(履行、拒绝){
let filter:any=(filterObj)[比较];
让name=Object.keys(过滤器);
如果(names.length!==1)
{
控制台日志(“??”);
返回拒绝({“代码”:400,“正文”:{“错误”:“无效比较”});
}
让name=names.toString();
如果(!CHelpers.isDataset(名称))
{
返回拒绝({“代码”:400,“正文”:{“错误”:“无效比较”});
}
让filterValue:number=filter[name];
if(过滤值的类型!=“编号”)
{
返回拒绝({“代码”:400,“正文”:{“错误”:“无效比较”});
}
let key:string=CHelpers.getKey(name);
console.log(“成功过滤”+比较);
返回完成(CHelpers.filterCourses(课程、关键字、filterValue、比较));
})
}

您应该尝试为fully和reject函数添加返回语句

public static filter(courses: Course[], filterObj: FILTER, comparison: string) {
    return new Promise(function (fulfill, reject) {
        let filter: any = (<any>filterObj)[comparison]; 

        let names = Object.keys(filter);
        if (names.length !== 1)
        {
            console.log("??");
            return reject({"code": 400, "body": {"error": "invalid comparison"}});
        }
        let name = names.toString();

        if (!CHelpers.isDataset(name))
        {
            return reject({"code": 400, "body": {"error": "invalid comparison"}});
        }

        let filterValue: number = filter[name];
        if (typeof filterValue !== "number")
        {
            return reject({"code": 400, "body": {"error": "invalid comparison"}});
        }

        let key: string = CHelpers.getKey(name);
        console.log("successfully filtered " + comparison);
        return fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison));

    })
}
公共静态筛选器(课程:课程[],筛选器对象:筛选器,比较:字符串){
返回新承诺(功能(履行、拒绝){
let filter:any=(filterObj)[比较];
让name=Object.keys(过滤器);
如果(names.length!==1)
{
控制台日志(“??”);
返回拒绝({“代码”:400,“正文”:{“错误”:“无效比较”});
}
让name=names.toString();
如果(!CHelpers.isDataset(名称))
{
返回拒绝({“代码”:400,“正文”:{“错误”:“无效比较”});
}
让filterValue:number=filter[name];
if(过滤值的类型!=“编号”)
{
返回拒绝({“代码”:400,“正文”:{“错误”:“无效比较”});
}
let key:string=CHelpers.getKey(name);
console.log(“成功过滤”+比较);
返回完成(CHelpers.filterCourses(课程、关键字、filterValue、比较));
})
}

thank jfriend00,helper函数正确地拒绝了,但是,我的catch块中的代码没有运行(调试器只突出显示catch语句,但跳过了其中的代码);这是否与“后续拒绝被忽略”有关,还是与其他原因有关?@icda